package com.example.springsecuritydemo.controller;

import com.example.springsecuritydemo.entity.User;
import com.example.springsecuritydemo.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户控制器，处理用户相关的HTTP请求
 */
@Controller
@RequestMapping("/users")
@Tag(name = "用户管理", description = "提供用户的CRUD操作接口")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    /**
     * 获取所有用户列表
     * @return 用户列表
     */
    @GetMapping( "getUserList")
    @ResponseBody
    @PreAuthorize("hasRole('USER') and authentication.name == 'test'") // 用户角色为USER时，可以访问此接口
    @Operation(summary = "获取所有用户", description = "查询系统中的所有用户信息列表")
    public List<User> getAllUsers() {
        return userService.selectAll();
    }
    
    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 用户信息
     */
    @PreAuthorize("hasRole('ADMIN')") // 管理员角色可以访问此接口
    @GetMapping("selectOneUser/{username}")
    @ResponseBody
    @Operation(summary = "根据用户名查询用户", description = "通过用户名获取指定用户的详细信息")
    public User getUserByUsername(@PathVariable String username) {
        User user = userService.findByUsername(username);
        if (user != null) {
            return user;
        }
        return null;
    }
    
    /**
     * 创建新用户
     * @param user 用户对象
     * @return 创建结果
     */
    @PostMapping("createUser")
    @ResponseBody
    @Operation(summary = "创建新用户", description = "创建一个新的用户账户")
    public void createUser(@RequestBody @Parameter(description = "用户信息对象") User user) {
        userService.saveUserDetails(user);
    }
    
    /**
     * 更新用户信息
     * @param id 用户ID
     * @param user 用户对象
     * @return 更新结果
     */
    @PutMapping("updateUser/{id}")
    @ResponseBody
    @Operation(summary = "更新用户信息", description = "根据用户ID更新用户信息")
    public ResponseEntity<String> updateUser(@PathVariable @Parameter(description = "用户ID") Integer id, 
                                            @RequestBody @Parameter(description = "用户信息对象") User user) {
        user.setId(id);
        int result = userService.update(user);
        if (result > 0) {
            return ResponseEntity.ok("User updated successfully");
        } else {
            return ResponseEntity.badRequest().body("Failed to update user");
        }
    }
    
    /**
     * 删除用户
     * @param id 用户ID
     * @return 删除结果
     */
    @DeleteMapping("deleteUser/{id}")
    @ResponseBody
    @Operation(summary = "删除用户", description = "根据用户ID删除指定用户")
    public ResponseEntity<String> deleteUser(@PathVariable @Parameter(description = "用户ID") Integer id) {
        int result = userService.deleteById(id);
        if (result > 0) {
            return ResponseEntity.ok("User deleted successfully");
        } else {
            return ResponseEntity.badRequest().body("Failed to delete user");
        }
    }
}